import java.awt.Font;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
 * Questa classe disegna i componenti dei tre pannelli centrali dell'applicazioni, 
 * cotenenti rispettivamente il campo in cui l'utente ha la possibilità di inserire
 * la soluzione con relativo pulsante di invio, il pannello di visualizzazione della
 * frase da indovinare ed infine il pannello contenente la frase di suggerimento per
 * l'utente.
 * Questa classe di appoggia sulla classe {@link XMLReader} per recuperare le 
 * informazioni da visualizzare
 * 
 * @author MatteoFrancia
 */
public class DrawCentralPanel 
{
    /**
     * ArrayList contenente le JLabel rappresentanti i singoli elementi del
     * pannello di visualizzazione della frase da indovinare.
     */
    ArrayList<JLabel> letters=new ArrayList<JLabel>();
    /**
     * JLabel rappresentante lo spazio tra il margine superiore del JPanel "four"
     * e il pulsante per l'invio della soluzione
     */
    JLabel space=new JLabel(new ImageIcon("imgs/Spazio.png"));
    /**
     * Label rappresentante la scritta "Suggerimento"
     */
    JLabel image=new JLabel(new ImageIcon("imgs/Suggerimento.png"));
    /**
     * ArrayList contenente le frasi recuperate dal file impostazioni.xml scomposte
     * nei loro componenti atomici, i caratteri.
     */
    ArrayList<Character> phrase=new ArrayList<Character>();
    /**
     * Font utilizzato per la visualizzazione delle frasi
     */
    Font font=new Font("Default", Font.BOLD, 22);
    /**
     * indica la manche attuale a cui si trova la partita
     */
    private int manche=0;
    
    /**
     * Questo metodo si occupa di recuperare il suggerimento 
     * relativo alla frase visualizzata 
     * 
     * @param hint pannello su cui visualizzare il suggerimento
     * @param manche turno della partita in corso
     */
    public void drawHint(JPanel hint,int manche)
    {
        PhrasesRetriever hintFinder=new PhrasesRetriever();
        // Crea un elenco dei suggerimenti
        String[] hints=hintFinder.retrieveHints();
        String hintString=hints[manche];
        // crea una label contenente il suggerimento e ne
        // setta i parametri relativi all'aspetto
        JLabel hintText = new JLabel(hintString);
        hintText.setFont(font);
        hint.add(image);
        // il suggerimento viene aggiunto al pannello
        hint.add(hintText);
    }

    /**
     * Questo metodo disegna le label rappresentanti le lettere della
     * frase da indovinare appoggiandosi sul metodo {@link writeHiddenPhrase}
     * 
     * @param central JPanel su cui disegnare il pannello
     */
    public void drawPhrase(JPanel central)
    {
        
        PhrasesRetriever pr=new PhrasesRetriever();
        //riempie l'arraylist phrase con le frasi lette dal file
        //impostazioni.xml
        phrase=pr.retrievePhrases();
        //crea tante JLabel quante sono le lettere visualizzabili dall'applicazione
        //inserendole successivamente nell'arraylist "letters" 
        for(int i=0;i<108;i++)
        {
            letters.add(new JLabel("-",new ImageIcon("imgs/letteraSfondo.png"),JLabel.CENTER));
        }
        
        writeHiddenPhrase(central,0);
        
       
    }
    
    /**
     * Questo metodo si occupa specificatamente di visualizzare in modo opportuno
     * sul pannello centrale le lettere della frase corrispondente alla manche
     * in corso.
     * 
     * @param central JPanel sul quale effettuare la visualizzazione
     * @param manche turno della partita in corso 
     */
    private void writeHiddenPhrase(JPanel central,int manche)
    {
        // PhraseController pc=new PhraseController();
        boolean endPhrase=false;
        
         while(!endPhrase)
        {
            for(int b=0;b<letters.size();b++)
             {
                JLabel jl=new JLabel();
                central.add(letters.get(b));
                jl=(JLabel)central.getComponent(b);
                jl.setVerticalTextPosition(JLabel.CENTER);
                jl.setHorizontalTextPosition(JLabel.CENTER);
                jl.setFont(font);
                
                if(b<phrase.size() && phrase.get(b).toString().equals(".")==false && !endPhrase)
                {
                    if(phrase.get(b).toString().equals("-") ||
                       phrase.get(b).toString().equals("!") || 
                       phrase.get(b).toString().equals("?") || 
                       phrase.get(b).toString().equals(" ") || 
                       phrase.get(b).toString().equals("'"))
                    {
                       jl.setText(phrase.get(b).toString());                     
                    }
                    else
                    {
                        jl.setText("*");
                        //pc.addLetter(phrase.get(b),b);
                    }
                }
                else
                {
                    endPhrase=true; 
                }
            }
        }
    }
    
    /**
     * Questo metodo si occupa di mettere a disposizione del concorrente un campo
     * di testo ed un pulsante per inserire una soluzione e verificarne la
     * correttezza
     * 
     * @param four JPanel su cui disegnare i componenti
     */
    public void drawSolution(JPanel four)
    {
        JButton solution = new JButton("Invia la soluzione");
        four.add(space);
        four.add(solution);
    }
}